<?php
include_once $_SERVER['DOCUMENT_ROOT'].'/lib/jObj.php';

class Validator extends jObj{
	public function getValidationErrors(){ return '['.implode(',',$this->errors['err']).']'; }

	public function checkType($data,$typ){
	  /*
	  if( is_array( $typ ) ){
			for($i=0,$cnt=count($typ),$rs=true; $i<$cnt && $rs; $i++)
	    	$t=$this->checkType($data,$typ[$i]);
	    	$rs&=
			return $rs;
		}
		*/

		if( $typ=='arr' && is_array( $data ) ) return true;
	  if( is_array( $data ) ){
				for($i=0,$cnt=count($data),$rs=true; $i<$cnt && $rs; $i++)
		    	$rs&=$this->checkType($data[$i],$typ);
		    return $rs;
		}

	  if($typ=='req') return 'req';
	  if(empty($data)) return true;

	  switch($typ){
	    case 'htm': return true; break;
	    case 'str': return true; break;
	    case 'upc':	if( strtoupper($data) == $data) return true; break;
	    case 'int':	if( is_numeric($data) ) return true;	break;
	    case 'flt':	if( floatval($data) === $data) return true;	break;
	    case 'dte':	if( preg_match('/^\d{4}-\d{2}-\d{2}$/i', $data) ) return true;	break;
	    case 'bol':	if((boolean)$data==$data) return true;	break;
	    case 'eml':	if( preg_match('/^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,4}$/i', $data) )return true;	break;
	    case 'pwd':	if( strlen($data)>12  )return true;	break;
	    case 'arr':	if( is_array($data)  )return true;	break;
	    default:
	      if( substr($typ, 0, 2)=='ch' ){
	        if( strlen($data)== intval(substr($typ, 2)) ) return true;
				}elseif( substr($typ,0,4)=='rgi:' ){
				  $rs=preg_match('~^'.substr($typ,4).'$~', $data, $m);
				  //echo $rs.'<pre class="debug">'.print_r ( $m ,true).'</pre>';
				  if($rs) return true;
				}
		}
		return false;
	}

	protected function makeCheck($data,$rules){
	  if(empty($data)) return false;
	  $reqs=array();$errs=array();
		foreach($data as $k=>$v){
			$t=false; $req=false;
		  if(!isset($rules[$k])) continue;
			if( is_array($rules[$k]) ){
			  for($i=0,$cnt=count($rules[$k]),$rs=true; $i<$cnt && $rs; $i++){
			    $r=self::checkType($v,$rules[$k][$i]);
					if( $r==='req' ){
						$req=$reqs[]=$k;
					}else{
					  $rs&=$r;
					}
				}
			}else{
		  	$rs=self::checkType($v,$rules[$k]);
				if( $rs==='req' ) $req=$reqs[]=$k;
			}

		  if(!$rs ) $this->error($k.':typeErr');
		}

		if(!empty($reqs))
			for($i=0,$cnt=count($reqs); $i<$cnt; $i++)
		  	if( empty( $data[ $reqs[$i] ] ) )
					$rs=$this->error($reqs[$i].':reqired');
//echo '<pre>',print_r( $this->getValidationErrors(), true),'</pre>'; exit();
		if(!empty($this->errors['err'])) return false;
		return true;
	}
}
?>
